home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / REALITY / distort / distort.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  4KB  |  209 lines

  1. /*
  2.  * Copyright 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.     distort.c
  19.     Drew Olbrich, 1992
  20.  
  21.     This program demonstrates how texture mapping can be
  22.     used for interactive image distortion effects.
  23.  
  24.     In this demo, an arbitrarily-sized image is mapped onto
  25.     a large array of texture mapped polygons.  The pop-up menu
  26.     can be used to choose between different kinds of distortion.
  27. */
  28.  
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <gl.h>
  32. #include <device.h>
  33.  
  34. #include "imagedata.h"
  35. #include "defs.h"
  36.  
  37. static EFFECT *effect = &DEFAULT_EFFECT;
  38.  
  39. static long menu;    /* pop up menu handle */
  40.  
  41. /*
  42.     Open and initialize a GL window.
  43. */
  44.  
  45. void display_init()
  46. {
  47.   foreground();
  48.   prefsize(WIN_SIZE_X, WIN_SIZE_Y);
  49.   winopen(WIN_TITLE);
  50.   icontitle(ICON_TITLE);
  51.   
  52.   doublebuffer();
  53.   RGBmode();
  54.   ortho(-0.5, WIN_SIZE_X - 0.5, -0.5, WIN_SIZE_Y - 0.5,    CLIP_NEAR, CLIP_FAR);
  55.   gconfig();
  56.  
  57.   cpack(0x00000000);
  58.   clear();
  59.  
  60.   cpack(0xFFFFFFFF);
  61.   cmov2i((WIN_SIZE_X - strwidth(WAIT_MSG))/2, 
  62.      (WIN_SIZE_Y - getlwidth())/2);
  63.   charstr(WAIT_MSG);
  64.  
  65.   swapbuffers();
  66.  
  67.   qdevice(REDRAW);
  68.   qdevice(MOUSEX);
  69.   qdevice(MOUSEY);
  70.   qdevice(LEFTMOUSE);
  71.   qdevice(RIGHTMOUSE);
  72.   qdevice(ESCKEY);
  73.   qdevice(WINSHUT);
  74.   qdevice(WINQUIT);
  75.   qdevice(WINCLOSE);
  76.  
  77.   menu = defpup("Distortion %t|Ripple|Rubber %l|Quit");
  78. }
  79.  
  80. /*
  81.     Load the image to distort, make a texture out of it,
  82.     and bind it.
  83. */
  84.  
  85. void image_init(char *fn)
  86. {
  87.   unsigned long *buf;
  88.   int width, height;
  89.   static float tex_props[] = { TX_WRAP, TX_CLAMP, TX_NULL };
  90.   static float tev_props[] = { TV_NULL };
  91.  
  92.   buf = longimagedata(fn, &width, &height);
  93.   if (buf == NULL)
  94.   {
  95.     fprintf(stderr, "distort: Can't load image file \"%s\".\n", fn);
  96.     exit(-1);
  97.   }
  98.  
  99.   texdef2d(1, 4, width, height, buf, 0, tex_props);
  100.   tevdef(1, 0, tev_props);
  101.  
  102.   texbind(TX_TEXTURE_0, 1);
  103.   tevbind(TV_ENV0, 1);
  104.  
  105.   free(buf);
  106. }
  107.  
  108. /*
  109.     Chew on those nifty GL events for a while.
  110. */
  111.  
  112. void event_loop()
  113. {
  114.   int done;
  115.   long dev;
  116.   short val;
  117.   long originx, originy;
  118.   int mousex, mousey;
  119.  
  120.   getorigin(&originx, &originy);
  121.  
  122.   done = 0;
  123.   while (!done)
  124.   {
  125.     effect->dynamics(mousex, mousey);
  126.     effect->redraw();
  127.  
  128.     while (qtest())
  129.     {
  130.       dev = qread(&val);
  131.       switch (dev)
  132.       {
  133.       case REDRAW :
  134.     getorigin(&originx, &originy);
  135.     effect->redraw();
  136.     break;
  137.       case LEFTMOUSE :
  138.     effect->click(mousex, mousey, val);
  139.     break;
  140.       case RIGHTMOUSE :
  141.     switch (dopup(menu))
  142.     {
  143.     case 1 :
  144.       effect = &ripple;
  145.       effect->init();
  146.       break;
  147.     case 2 :
  148.       effect = &rubber;
  149.       effect->init();
  150.       break;
  151.     case 3 :
  152.       done = 1;
  153.       break;
  154.     }
  155.     break;
  156.       case MOUSEX :
  157.     mousex = val - originx;
  158.     break;
  159.       case MOUSEY :
  160.     mousey = val - originy;
  161.     break;
  162.       case WINQUIT :
  163.       case WINSHUT :
  164.       case WINCLOSE :
  165.       case ESCKEY :
  166.     done = 1;
  167.     break;
  168.       }
  169.     }
  170.   }
  171. }
  172.  
  173. /*
  174.     If a command line argument is provided, it is interpreted
  175.     as the name of an alternate source image.
  176. */
  177.  
  178. void main(int argc, char **argv)
  179. {
  180.   if (!getgdesc(GD_TEXTURE))
  181.   {
  182.     char buf[256];
  183.     FILE *file;
  184.  
  185.     file = fopen("/usr/sbin/inform", "r");
  186.     if (file == NULL)
  187.       fprintf(stderr, "%s: %s\n", argv[0], MSG_NO_TEXTURING);
  188.     else
  189.     {
  190.       fclose(file);
  191.       sprintf(buf, "/usr/sbin/inform %s", MSG_NO_TEXTURING);
  192.       system(buf);
  193.     }
  194.  
  195.     exit(-1);
  196.   }
  197.  
  198.   display_init();
  199.  
  200.   effect->init();
  201.  
  202.   if (argc == 1)
  203.     image_init(DEFAULT_IMAGE_FN);
  204.   else
  205.     image_init(argv[1]);
  206.  
  207.   event_loop();
  208. }
  209.